package kgame5.kengine.gameunit {
import kgame5.k3d.core.obj3d.hardvo.HardVO;
import kgame5.kengine.events.GUViewEvent;
import kgame5.kengine.events.SendCommandEvent;
import kgame5.kengine.gameunit.parts.GUViewComp;

import flash.events.EventDispatcher;

/**
 * @author kk
 * 相当于pureMVC里的facade
 * 游戏实体，包括逻辑数据HardVO和视图数据EntityViewComp
 * 
 * 包括fsm和view.此为中介者模式。fsm和view不直接通信
 */
public class GameUnit extends EventDispatcher{
	//刚体信息，做成public是因为太常用了
	public var hard:HardVO;
	//显示用的渲染,负责控制视图.视图通过addEventListner向GameUnti通信
	private var _view:GUViewComp;
	
	private var id:int;
	private var classifyID:int;//大类，是坦克，弹药，还是道具
	private var typeID:int;//何种型号metaID
	
	public var isCollideAble:Boolean=false;//是否参与碰撞
	
	public var vo:Object;//自己的valueObject
	
	public function GameUnit(param:GUConstructorParam){
		
		this.vo=param.vo;
		
		this.id=param.id;
		
		this.classifyID = param.classifyID;
		this.typeID = param.typeID;
		
		this._view=param.view;
		this._view.addEventListener(GUViewEvent.TYPE, onGUViewEvent);
		this._view.addEventListener(SendCommandEvent.TYPE, onSendCommandEvent);
		
		hard=new HardVO();
		
		//fsm=...
		//fsm.addEventListner(EAT_OK,onFSMEatOK);
		//_view.addEventListner(EAT_OK,onViewEatOK);
		
		collideList=new Vector.<GameUnit>();
	}
	
	//析构函数
	public function dispose():void{
		
	}
	
	//返回之后是需要转型一下的
	public function getVO():Object{
		return vo;
	}
	
	public function getView():GUViewComp{
		return _view;
	}
	
	public function getID():int{
		return id;
	}
	public function getClassifyID():int{
		return this.classifyID;
	}
	public function getTypeID():int{
		return this.typeID;
	}
	
	//执行更新
	public function update():void{
		//fsm.update();
		_view.update();
	}
	
	//============发通知调用GamePlay的command=============
	//这个一般是通过FSM发过来的通知而调用,也有GUView发来的
	protected function sendCommand(commandName:String,data:Object=null):void{
		this.dispatchEvent(new SendCommandEvent(commandName,data));
	}
	
	//==============新式的CollideList系列================
	//TODO 这个目前只在GameActor中实现了相互碰撞。后期可以参考box2D中的碰撞过滤机制
	//碰撞列表,记录每帧检测到的自己和别人的碰撞，都记录在这个表里，具体的state用的时候从这里里面往外提取
	//TODO 每次创建一个新对象，比较昂贵啊
	private var collideList:Vector.<GameUnit>;
	
	public function addCollideItem(gu:GameUnit):void{
		collideList.push(gu);
	}
	public function getCollideList():Vector.<GameUnit>{
		return collideList;
	}
	public function clearCollideInfo():void{
		collideList=new Vector.<GameUnit>();
	}
	
	//==============处理view发送来的事件================
	//被子类继承
	protected function onGUViewEvent(e:GUViewEvent):void{
		/*var data:XX=e.getBody() as XX;
		 * swithc(e.getName()){
		 * case NNN:
		 * 处理
		 * break;
		 * }
		 */
	}
	
	//==============处理view请求发送command================
	//得到fsm命令发送Command
	protected function onSendCommandEvent(e:SendCommandEvent):void{
		this.sendCommand(e.getCommandName(),e.getData());//被重新生成一个command.关系不大，command不是每帧都调用
	}
}
}
